home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / lang / SmallEiffel.lha / SmallEiffel / lib_se / creation_call_3_4.e < prev    next >
Text File  |  1998-12-22  |  5KB  |  172 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  4. --                       http://www.loria.fr/SmallEiffel
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it 
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later 
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License 
  11. -- for  more  details.  You  should  have  received a copy of the GNU General 
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. deferred class CREATION_CALL_3_4
  17.    
  18. inherit CREATION_CALL;
  19.    
  20. feature 
  21.    
  22.    call: PROC_CALL;
  23.  
  24. feature
  25.  
  26.    afd_check is
  27.       do
  28.      if arg_count > 0 then
  29.         run_args.afd_check;
  30.      end;
  31.       end;
  32.  
  33. feature {NONE}
  34.    
  35.    run_args: EFFECTIVE_ARG_LIST is
  36.       do
  37.      Result := call.arguments;
  38.       end;
  39.  
  40.    check_creation_clause(t: TYPE) is
  41.       require
  42.      t.is_run_type
  43.       local
  44.      ct: TYPE;
  45.      fn: FEATURE_NAME;
  46.      bottom, top: BASE_CLASS;
  47.      args: like run_args;
  48.       do
  49.      fn := call.feature_name;
  50.      top := fn.start_position.base_class;
  51.      bottom := t.base_class;
  52.      if t.is_like_current then
  53.         check 
  54.            bottom = top or else bottom.is_subclass_of(top)
  55.         end;
  56.         fn := bottom.new_name_of(top,fn);
  57.         if fn = Void then
  58.            fn := call.feature_name;
  59.            eh.add_position(fn.start_position);
  60.            eh.append(fz_09);
  61.            eh.append(fn.to_string);
  62.            eh.append("%" not found for type %"");
  63.            eh.append(t.run_time_mark);
  64.            fatal_error(fz_03);
  65.         end;
  66.      end;
  67.      run_feature := t.run_class.get_feature(fn);
  68.      if run_feature = Void then
  69.         cp_not_found(fn);
  70.      end;
  71.      if small_eiffel.short_flag then
  72.      elseif not t.has_creation(fn) then
  73.         eh.add_position(call.feature_name.start_position);
  74.         eh.add_position(fn.start_position);
  75.         eh.append(fn.to_string);
  76.         eh.append(" is not in the creation list of ");
  77.         eh.add_type(t,fz_dot); 
  78.         eh.print_as_fatal_error;
  79.      end;
  80.      run_feature.add_client(current_type.run_class);
  81.      if run_feature.result_type /= Void then
  82.         eh.add_position(run_feature.start_position);
  83.         eh.add_position(fn.start_position);
  84.         fatal_error("Feature found is not a procedure.");
  85.      end;
  86.      if arg_count = 0 and then run_feature.arguments /= Void then
  87.         eh.add_position(run_feature.start_position);
  88.         eh.add_position(start_position);
  89.         fatal_error("Procedure found has argument(s).");
  90.      end;
  91.      if arg_count > 0 then
  92.         ct := small_eiffel.top_rf.current_type;
  93.         args := call.arguments.to_runnable(ct);
  94.         if args = Void then
  95.            error(call.arguments.start_position,fz_bad_arguments);
  96.         else
  97.            args.match_with(run_feature,ct); 
  98.         end;
  99.      end;
  100.      call := call.make_runnable(writable,args,run_feature);
  101.       end;
  102.    
  103.    is_pre_computable: BOOLEAN is
  104.       local
  105.      rfct: TYPE;
  106.      rfn, rfctbcn: STRING;
  107.       do
  108.      if writable.is_result then
  109.         if run_args = Void then
  110.            Result := true;
  111.         else
  112.            Result := run_args.is_pre_computable;
  113.         end;
  114.         if Result then
  115.            if run_feature.is_pre_computable then
  116.            else
  117.           rfct := run_feature.current_type;
  118.           rfctbcn := rfct.base_class.name.to_string;
  119.           rfn := run_feature.name.to_string;
  120.           if us_make= rfn then
  121.              if us_array = rfctbcn then
  122.              elseif us_fixed_array = rfctbcn then
  123.              elseif us_string = rfctbcn then
  124.              elseif us_dictionary = rfctbcn then
  125.              elseif us_std_file_read = rfctbcn then
  126.              elseif us_std_file_write = rfctbcn then
  127.              else 
  128.             Result := false;
  129.              end;
  130.           elseif us_blank = rfn then
  131.              if us_string = rfctbcn then
  132.              else
  133.             Result := false;
  134.              end;
  135.           elseif us_with_capacity = rfn then
  136.              if us_array = rfctbcn then
  137.              elseif us_fixed_array = rfctbcn then
  138.              elseif us_dictionary = rfctbcn then
  139.              else
  140.             Result := false;
  141.              end;
  142.           else
  143.              Result := false;
  144.           end;
  145.            end;
  146.         end;
  147.      end;
  148.       end;
  149.  
  150. feature {NONE}
  151.  
  152.    cp_not_found(fn: FEATURE_NAME) is
  153.       do
  154.      eh.add_position(call.feature_name.start_position);
  155.      eh.add_position(fn.start_position);
  156.      fatal_error("Creation procedure not found.");
  157.       end;
  158.  
  159.    c2c_expanded_initializer(t: TYPE) is
  160.       local
  161.      rf3: RUN_FEATURE_3;
  162.       do
  163.      rf3 := t.expanded_initializer;
  164.      if rf3 /= Void then
  165.         cpp.expanded_writable(rf3,writable);
  166.      end;
  167.       end;
  168.  
  169. end -- CREATION_CALL_3_4
  170.  
  171.  
  172.